package net.sync.lesson1.sync002;
/**
 * 关键字synchronized取得的锁都是对象锁，而不是把一段代码（方法）当做锁，
 * 所以代码中哪个线程先执行synchronized关键字的方法，哪个线程就持有该方法所属对象的锁（Lock），
 * 
 * 在静态方法上加synchronized关键字，表示锁定.class类，类一级别的锁（独占.class类）。
 *
 */
public class MyThread2 {
	private  int num = 0;
	private static   int aa = 0;
	/** 不加static */
	public  synchronized void printNum(String tag){
		try {
			if(tag.equals("a")){
				num = 100;
				System.out.println("tag a, set num over!");
				Thread.sleep(1000);
			} else {
				num = 200;
				System.out.println("tag b, set num over!");
			}
			System.out.println("tag " + tag + ", num = " + num);
			
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	/** 加static */
	public static synchronized void printNum1(String tag){
		try {
			if(tag.equals("a")){
				aa = 100;
				System.out.println("tag a, set num over!");
				Thread.sleep(1000);
			} else {
				aa = 200;
				System.out.println("tag b, set num over!");
			}
			System.out.println("tag " + tag + ", num = " + aa);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	//注意观察run方法输出顺序
	public static void main(String[] args) {
		//俩个不同的对象
		final MyThread2 m1 = new MyThread2();
		final MyThread2 m2 = new MyThread2();
		
		Thread t1 = new Thread(()-> {
				m1.printNum1("a");
		});
		
		Thread t2 = new Thread(()-> {
			m2.printNum1("b");
		});		
		
		t1.start();
		t2.start();
		
	}
}
